﻿using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DeHeng_Mes.Utils
{
    class HttpUtils {

        /// <summary>
        /// HTTP请求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="jwt"></param>
        /// <param name="requestType"></param>
        /// <param name="data"></param>
        /// <param name="encoding"></param>
        /// <param name="mediaType"></param>
        /// <returns></returns>
        /// <exception cref="CustomException"></exception>
        public static async Task<string> HttpRequestAsync(string url, string jwt = null, HttpRequestType? requestType = HttpRequestType.GET, Object data = null, Encoding encoding = null, string mediaType = "application/json") {
            // 忽略SSL验证
            HttpClientHandler handler = new HttpClientHandler();
            handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
            // HTTP客户端
             HttpClient client = new HttpClient();
            // 设置JWT身份验证头
            if (jwt != null) {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwt);
            }
            // 构造请求内容
            StringContent content = new StringContent(string.Empty);
            if (data != null) {
                content = new StringContent(JsonConvert.SerializeObject(data), encoding ?? Encoding.UTF8, mediaType);
            }
            // 发起请求
            //Logger.Info(String.Format("http request,  url: {0}, type: {1}, body: {2}", url, requestType, data));
            HttpResponseMessage response = null;
            // 判断请求类型
            switch (requestType) {
                case HttpRequestType.GET:
                    response = await client.GetAsync(url);
                    break;
                case HttpRequestType.POST:
                    response = await client.PostAsync(url, content);
                    break;
                case HttpRequestType.PUT:
                    response = await client.PutAsync(url, content);
                    break;
                case HttpRequestType.DELETE:
                    response = await client.DeleteAsync(url);
                    break;
            }
            // 检查响应是否成功
            if (response?.IsSuccessStatusCode == true) {
                // 读取响应内容
                string responseBody = await response.Content.ReadAsStringAsync();
                return responseBody;
            } else {
                throw new Exception(String.Format("HTTP请求失败，状态码：{0}", response?.StatusCode));
            }
        }
        
        /// <summary>
        /// HTTP请求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="jwt"></param>
        /// <param name="requestType"></param>
        /// <param name="data"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static async Task<string> HttpRequestAsync(string url, string jwt = null, HttpRequestType? requestType = HttpRequestType.GET, Object data = null, CancellationToken cancellationToken = default) {
            try {
                // 忽略SSL验证
                HttpClientHandler handler = new HttpClientHandler();
                handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
                // HTTP客户端
                HttpClient client = new HttpClient(handler);
                // 设置JWT身份验证头
                if (!string.IsNullOrEmpty(jwt)) {
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwt);
                }
                // 构造请求内容
                StringContent content = new StringContent(string.Empty);
                if (data != null) {
                    content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
                }
                // 发起请求
                HttpResponseMessage response = null;
                // 判断请求类型
                switch (requestType) {
                    case HttpRequestType.GET:
                        response = await client.GetAsync(url, cancellationToken);
                        break;
                    case HttpRequestType.POST:
                        response = await client.PostAsync(url, content, cancellationToken);
                        break;
                    case HttpRequestType.PUT:
                        response = await client.PutAsync(url, content, cancellationToken);
                        break;
                    case HttpRequestType.DELETE:
                        response = await client.DeleteAsync(url, cancellationToken);
                        break;
                }
                // 检查响应是否成功
                if (response?.IsSuccessStatusCode == true) {
                    // 读取响应内容
                    string responseBody = await response.Content.ReadAsStringAsync();
                    return responseBody;
                } else {
                    throw new Exception(String.Format("HTTP请求失败，状态码：{0}", (int)response?.StatusCode));
                }
            } catch (OperationCanceledException ex) {
                throw new Exception(String.Format("HTTP请求失败，请求已终止：{0}", ex.Message));
            } catch (Exception) {
                throw;
            }
        }
    }
}
